'''
----学生类----
编写一个学生类：
属性：姓名、性别、类别默认为people
方法：hello
'''


# 类的定义
class Stu:
    category = 'people'  # 类的属性；属性名=属性值

    def __init__(self, name, sex):
        self.name = name
        self.sex = sex

    def hello(self):  # 类的方法
        print(f'大家好，我的名字是{self.name}')


# 通过对象调用类的属性和类的方法
zy = Stu('zy', '女')  # 对象名=类名（）
print(zy.category)  # 对象名.属性名 # 访问属性
zy.hello()  # 对象名.方法名() # 调用方法
lisi = Stu('lisi', '男')
lisi.hello()


# # 1.
# print(Stu.category)  # 通过 类 来调用类属性
# # 2.
# stu = Stu()
# print(stu.category)  # 通过对象调用 类属性
#
# # 只能通过类修改 类属性（不能通过对象修改）
# Stu.category = 'people1'
# print(Stu.category)


# ----QQ群类----
# 编写一个QQ群类：
# 属性：群号、群名、成员、群暗号
# 方法：显示群号、显示群名、显示群成员、出示群暗号、添加群成员、移除群成员
class QQGroup:
    def __init__(self, id, name, members, signal):
        self.id = id
        self.name = name
        self.members_list = members
        self.signal = signal

    def get_id(self):
        return self.id

    def get_name(self):
        return self.name

    def get_members(self):
        return self.members_list

    def show_signal(self):
        tag = 0  # 查看暗号是否正确
        pwd = input('请出示你的暗号：')
        if pwd == self.signal:
            tag = 1
        return tag

    def add_member(self):
        tag = self.show_signal()
        if tag == 1:
            name = input('请输入新成员名字：')
            self.members_list.append(name)
        print(self.members_list)

    def del_member(self):
        msg = 0
        tag = self.show_signal()
        if tag == 1:
            name = input('请输入移除成员名字：')
            for member in self.members_list:
                if name == member:
                    msg = 1
                    self.members_list.remove(member)
                    print(self.members_list)
            if msg == 0:
                print('成员不存在')


if __name__ == '__main__':
    qq1 = QQGroup(999999, '软件测试群', ['test1', 'test2'], '123')

    print(qq1.get_id())
    print(qq1.get_name())
    print(qq1.get_members())
    qq1.add_member()
    qq1.del_member()

# ----案例：银行卡类----
# 编写一个银行卡类：
# 属性：银行名称、卡号、密码、姓名、余额
# 方法：登录、存款、取款


# ----封装案例：银行卡类----
# 编写一个银行卡类：
# 属性：银行名称、卡号、密码、姓名、余额
# 方法：登录、存款、取款
# 封装属性：余额
# 封装方法：登录
# 增加方法：显示余额、初始化余额
# class BankCard:
#     def __init__(self, id, name, password, balance):
#         self.bank_name = '中国银行'
#         self.id = id
#         self.name = name
#         self.password = password
#         self.balance = balance
#
#     def assert(self):  # 登录
#         id = input('请输入银行卡号：')
#         pwd = input('请输入银行卡密码：')
#         if id == self.id and pwd == self.password:
#             print('登录成功！')
#             return 'ok'
#         else:
#             print('登陆失败')
#             return 'no'
#
#     def add_money(self):  # 存款
#         re = self.assert()
#         if re == 'ok':
#             money = float(input('请输入存款金额为：'))
#             self.balance = self.balance + money
#             print(f"用户{self.name}存入{money}元，卡余额为{self.balance}元")
#
#     def take_money(self):  # 取款
#         re = self.assert()
#         if re == 'ok':
#             money = float(input('你的取出金额为：'))
#             if money <= self.balance:
#                 self.balance -= money
#                 print(f'用户{self.name}取出{money}元，余额为{self.balance}')
#             else:
#                 print(f'取款失败，金额不足')
#
#
# if __name__ == '__main__':
#     c1 = BankCard('1001', 'zy', '123', '1000')
#     # print(c1.assert())
#     c1.add_money()
#     c1.take_money()
print("---------银行卡类---------")


class Card:
    def __init__(self, number, name, balance):
        self.number = number
        self.name = name
        self.blance = balance

    def save_money(self, balance):  # 存钱方法
        self.blance += balance

    def get_money(self, balance):  # 取钱方法
        if balance > self.blance:
            print('余额不足')
            return False
        else:
            self.blance -= balance
            return True

    def search_blance(self):  # 查询方法
        print('卡号：{},姓名：{} 的余额是：{}'.format(self.number, self.name, self.blance))

    def give_money(self, card, balance):
        # if balance > self.balance:
        #     print('余额不足')
        # else:
        #     card.balance += balance
        #     self.balance -= balance
        flag = self.get_money(balance)
        if flag:
            card.save_money(balance)


class ATM:
    def __init__(self, name=None, size=None, card=None):
        self.name = name
        self.size = size
        self.card = card

    def insert_card(self, card):  # 插卡
        self.card = card

    def save_money(self, blance):  # 存钱
        self.card.save_money(blance)

    def get_money(self, blance):  # 取钱
        self.card.get_money(blance)

    def search_blance(self):  # 查看
        self.card.search_blance()

    def give_money(self, card, blance):
        self.card.give_money(card, blance)


card1 = Card('1001', 'test1', 10000)
# card1.search_blance()
# card1.save_money(8000)
# card1.search_blance()
# card1.get_money(2000)
# card1.search_blance()
#
# card2 = Card('002', '貂蝉', 0)
# card1.give_money(card2, 20000)
# card2.search_blance()


atm = ATM()
atm.insert_card(card1)
atm.search_blance()

atm.save_money(1000)
atm.search_blance()


# ----无人新零售----
# 随着无人新零售经济的崛起，商场、车站、大厦等各种场所都引入了无人饮品自动售货机，方便人们选购自己想要的饮品。
# 购买者选择想要的饮品，通过投币或扫码的方式支付，支付成功后从出货口取出饮品。
# 本案例要求编写代码，利用函数实现具有显示饮品信息、计算销售总额等功能的程序。

# 饮品信息 可以字典存储
# goods = {'可口可乐': 2.5, '百事可乐': 2.5, '冰红茶': 3, '脉动': 3.5}

# 饮品信息 可以列表嵌套字典存储
# goods1 = {'id': '1001', 'name': '可口可乐', 'price': 2.5}
# goods2 = {'id': '1002', 'name': '冰红茶', 'price': 3}
# goods3 = {'id': '1003', 'name': '脉动', 'price': 3.5}
# goods_list = [goods1, goods2, goods3]

def show_goods():
    goods = {
        '1': {'name': '可乐', 'price': 3.0},
        '2': {'name': '雪碧', 'price': 2.5},
        '3': {'name': '矿泉水', 'price': 1.5},
        '4': {'name': '果汁', 'price': 4.0}
    }

    print("饮品信息:")
    for key, value in goods.items():
        print(f"{key}. {value['name']} - ￥{value['price']}")


def total():
    goods = {
        '1': {'name': '可乐', 'price': 3.0},
        '2': {'name': '雪碧', 'price': 2.5},
        '3': {'name': '矿泉水', 'price': 1.5},
        '4': {'name': '果汁', 'price': 4.0}
    }

    total_price = 0.0
    while True:
        choice = input("请选择饮品编号 (输入 q 结束选择): ")
        if choice == 'q':
            break
        if choice in goods:
            quantity = int(input("请输入购买数量: "))
            price = goods[choice]['price']
            total_price += price * quantity
        else:
            print("无效的饮品编号，请重新选择。")

    print(f"总额为: ￥{total_price}")


def main():
    show_goods()
    total()


main()

# ----猜拳游戏----
# 猜拳游戏又称“猜丁壳”，是一个古老、简单、常用于解决争议的游戏。
# 猜拳游戏一般包含3种手势：石头、剪刀、布，
# 判定规则为石头胜剪刀，剪刀胜布，布胜石头。
# 本案例要求编写代码，实现基于面向对象思想的人机猜拳游戏。
import random
# 定义一个人类
class person():
    def play(self):
        while True:  # 做一个死循环，直到选择正确为止
            finger = input("请输入要出拳的选项：\n1---石头   2---剪刀   3---布\n")
            if finger.isdigit():  # isdigit() 方法检测字符串是否只由数字组成
                finger = int(finger)  # 将input默认输入的为字符类型，将它转化为数字类型
                if finger == 1:  # 用if判断玩家的出拳
                    print("[玩家]选择出---石头")  # 输出玩家的出拳
                    break  # 选择正确时，结束死循环
                elif finger == 2:
                    print("[玩家]选择出---剪刀")
                    break
                elif finger == 3:
                    print("[玩家]选择出--- 布 ")
                    break
                else:
                    print("输入数字有误！请重新输入---")
            else:
                print("输入选项有误！请输入数字---")
        return finger  # 返回玩家的出拳


# 定义电脑类
class computer():
    def stochastic(self):
        random_number = random.randint(1, 3)  # 用random.randint(1,3)产生一个1到3的随机整数
        if random_number == 1:  # 用if判断电脑的出拳
            print("[电脑]选择出---石头")  # 输出电脑的出拳
        elif random_number == 2:
            print("[电脑]选择出---剪刀")
        else:
            print("[电脑]选择出--- 布 ")
        return random_number  # 返回电脑的出拳


# 定义一个过程类
class process():
    print("---------------人机大战---------------\n")
    case1 = 0  # case1表示玩家胜利的次数
    case2 = 0  # case2表示平局的次数
    case3 = 0  # case1表示电脑胜利的次数

    def _init_(self):
        person_object = person()  # person类 对象
        computer_object = computer()  # computer类 对象
        while True:  # 做一个死循环，一直进行游戏，直到玩家想要结束游戏

            person_result = person_object.play()  # 用person_result接受玩家的出拳
            computer_result = computer_object.stochastic()  # 用computer_result接受电脑的出拳

            # 1:石头，2:剪刀，3:布，比较结果，判断此次游戏谁赢
            if person_result == 1 and computer_result == 2 or \
                    person_result == 2 and computer_result == 3 or \
                    person_result == 3 and computer_result == 1:
                print("------------------------玩家赢！")
                self.case1 += 1  # 此时玩家胜利的次数case1+1
            elif person_result == computer_result:
                print("------------------------ 平局！ ")
                self.case2 += 1  # 此时平局的次数case2+1
            else:
                print("------------------------电脑赢！")
                self.case3 += 1  # 此时电脑胜利的次数case3+1
            # 接收输入，玩家是否想要继续游戏，将接收的输入转化为小写，和'n'进行比较，如果等于结束游戏，反之继续
            if input("是否继续游戏：yes or no ?\n按任意键继续，输入n或者N结束游戏\n").lower() == "n":
                break

        if self.case1 > self.case3:  # 玩家选择结束游戏之后，对之前所有的战局进行统计对比，判断谁赢
            result = "玩家胜利！"
        elif self.case1 == self.case3:
            result = "平局"
        else:
            result = "电脑胜利"
        # 输出整个游戏的结束
        print("---------------人机大战---------------\n游戏结束：\n"
              "玩家共赢{0}次---电脑共赢{1}次---平局次数{2}次\n---总结果为：{3}" \
              .format(self.case1, self.case3, self.case2, result))

    # 主函数，开始游戏


process()._init_()
